home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / lang / lisp / guile-ii.src / guile-ii / guile-src / gls / mrequire.scm < prev    next >
Encoding:
Text File  |  1995-01-07  |  5.3 KB  |  153 lines

  1. ;;; $Id: mrequire.scm,v 1.1 1995/01/06 17:59:57 miles Exp $
  2. ;;; ----------------------------------------------------------------
  3. ;;; mrequire.scm -- Wrapper for slib require/provide that makes it modular
  4. ;;; 4 Jan 1995, Miles Bader <miles@eskimo.com>
  5. ;;; ----------------------------------------------------------------
  6. ;;;
  7.  
  8. (in-package slib)
  9.  
  10. (export-library slib (slib require) guile (record defmacro))
  11. (export-library guile (slib))        ; make slib usable from the guile lib
  12.  
  13. (use-library guile)
  14.  
  15. ;; ----------------------------------------------------------------
  16.  
  17. (in-module slib)
  18.  
  19. (export-interface require
  20.  (REQUIRE PROVIDE PROVIDED?
  21.   (REQUIRE REQUIRE:REQUIRE)
  22.   (PROVIDE REQUIRE:PROVIDE)
  23.   (PROVIDED? REQUIRE:PROVIDED?)))
  24.  
  25. ;; The initial interface used by an slib module
  26. (export-interface slib
  27.  require
  28.  slib-hooks
  29.  vicinity
  30.  time
  31.  guile)
  32.  
  33. (use-interface guile)
  34. (use-interface guile-internals)
  35. (use-interface slib-hooks (*features*))
  36. (use-interface module)
  37. (use-interface variable)
  38. (use-interface vicinity)
  39.  
  40. ;; ----------------------------------------------------------------
  41.  
  42. (define *require-pathname* (in-vicinity (library-vicinity) "require.scm"))
  43.  
  44. (define *slib-package* (find-module 'slib *root-package* #f))
  45. (define *slib-library* (find-interface 'slib *root-package* #f))
  46.  
  47. (define *slib-module-initial-interface*
  48.   (find-interface 'slib *slib-package* #f))
  49.  
  50. (define (make-slib-module)
  51.   (let ((module (make-module)))
  52.     (module-use! module *slib-module-initial-interface*)
  53.     module))
  54.  
  55. ;; ----------------------------------------------------------------
  56.  
  57. (define *require-module*
  58.   (find-module 'require *slib-package* make-slib-module))
  59.  
  60. ;; The internal variables in the require module that we fuck with to fool the
  61. ;; slib require/provide code into using modules.  We just share variables in
  62. ;; our module with it.
  63. ;;
  64. (define *provide-variable* (module-variable (current-module) 'provide))
  65. (module-add! *require-module* 'provide *provide-variable*)
  66. (module-add! *require-module* 'require:provide *provide-variable*)
  67. ;;
  68. (define *require-variable* (module-variable (current-module) 'require))
  69. (module-add! *require-module* 'require *require-variable*)
  70. (module-add! *require-module* 'require:require *require-variable*)
  71. ;;
  72. (define *provided?-variable* (module-variable (current-module) 'provided?))
  73. (module-add! *require-module* 'provided? *provided?-variable*)
  74. (module-add! *require-module* 'require:provided? *provided?-variable*)
  75.  
  76. ;; Load the slib require code into our deviously prepared receptacle...
  77. (let ((load-module *load-module*))
  78.   (dynamic-wind (lambda () (set! *load-module* *require-module*))
  79.         (lambda () (try-load *require-pathname*))
  80.         (lambda () (set! *load-module* load-module))))
  81.  
  82. ;; Stash the slib version of these routines
  83. (define slib-require (variable-ref *require-variable*))
  84. (define slib-provide (variable-ref *provide-variable*))
  85. (define slib-provided? (variable-ref *provided?-variable*))
  86.  
  87. ;; Things not represented by separate interfaces (that are in the core)
  88. (define *core-features*
  89.   (do ((features *features* (cdr features))
  90.        (core '()))
  91.       ((null? features) core)
  92.     (if (not (module-bound? *slib-library* (car features)))
  93.     (set! core (cons (car features) core)))))
  94.  
  95. ;; ----------------------------------------------------------------
  96.  
  97. ;; Require loads the given slib code into its own unique module in the slib
  98. ;; package, 
  99. (define (require name)
  100.   (if (not (memq name *core-features*))
  101.       (let ((interface (module-ref *slib-library* name #f)))
  102.     (if (not interface)
  103.         (let* (;; the new module to put the loaded code into
  104.            (module (find-module name *slib-package* make-slib-module))
  105.            ;; what to restore *load-module* to after loading
  106.            (old-load-module *load-module*)
  107.            ;; what to restore the current-module to after loading
  108.            (old-module (current-module))
  109.            ;; A list of things PROVIDEd by the module
  110.            (names (list name))
  111.            ;; A provide routine that stashes the names in NAMES
  112.            (%provide
  113.             (lambda (what)
  114.               (if (symbol? what)
  115.               (set! names (cons what (delq! what names))))
  116.               (slib-provide what)))
  117.            ;; what to restore the provide routine to
  118.            (old-provide (variable-ref *provide-variable*)))
  119.           (dynamic-wind
  120.            (lambda ()
  121.          (variable-set! *provide-variable* %provide)
  122.          (set! *load-module* module)
  123.          (set-current-module module))
  124.            (lambda ()
  125.          (slib-require name))
  126.            (lambda ()
  127.          (set-current-module old-module)
  128.          (set! *load-module* old-load-module)
  129.          (variable-set! *provide-variable* old-provide)))
  130.  
  131.           ;; Make an interface to this module; although it has exactly
  132.           ;; the same contents as MODULE, we need a separate interface to
  133.           ;; avoid use-loops.
  134.           (set! interface (find-interface name *slib-package* #t))
  135.  
  136.           ;; Export everything in the module to the interface
  137.           (module-export module interface)
  138.  
  139.           ;; Alias the same interface under any other PROVIDEd names
  140.           (for-each (lambda (alias)
  141.               (if (not (eq? alias name))
  142.                   (import-variable name *slib-package*
  143.                            alias *slib-package*)))
  144.             (cdr names))
  145.  
  146.           ;; And export all of them from the slib library
  147.           (module-export *slib-package* *slib-library* names)))
  148.     (module-use! (current-module) interface))))
  149.  
  150. (define (provided? feature)
  151.   (or (and (symbol? feature) (module-bound? *slib-library* feature))
  152.       (slib-provided? feature)))
  153.